package com.xxxx.ifms.service;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.xxxx.ifms.base.BaseQuery;
import com.xxxx.ifms.base.BaseService;
import com.xxxx.ifms.dao.VoucherMapper;
import com.xxxx.ifms.enums.DevResult;
import com.xxxx.ifms.enums.StateStatus;
import com.xxxx.ifms.query.VoucherQuery;
import com.xxxx.ifms.utils.AssertUtil;
import com.xxxx.ifms.utils.AssertUtil;
import com.xxxx.ifms.vo.Voucher;
import com.xxxx.ifms.vo.Voucher;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

@Service
public class VoucherService extends BaseService<Voucher, Integer> {
    @Resource
    private VoucherMapper voucherMapper;

    /**
     * 条件查询
     *
     * @param voucherQuery
     * @return
     */
    public Map<String, Object> queryVoucherByParams(VoucherQuery voucherQuery) {
        Map<String, Object> map = new HashMap<>();
        // 开启分页
        PageHelper.startPage(voucherQuery.getPage(), voucherQuery.getLimit());
        // 得到对应分页对象
        PageInfo<Voucher> pageInfo = new PageInfo<>(voucherMapper.selectByParams(voucherQuery));
        // 设置map对象
        map.put("code", 0);
        map.put("msg", "success");
        map.put("count", pageInfo.getTotal());
        // 设置分页好的列表
        map.put("data", pageInfo.getList());

        return map;
    }

    /**
     * 添加凭据
     * Integer voucherNo  notnull
     * String voucherName notnull
     * Integer voucherType notnull
     * Date voucherDate notnull
     * String overview;
     *
     * @param voucher
     */
    @Transactional(propagation = Propagation.REQUIRED)
    public void addVoucher(Voucher voucher) {
        /* 1. 校验参数合法性 */
        checkVoucherParams(voucher.getVoucherNo(), voucher.getVoucherName(), voucher.getVoucherType(), voucher.getVoucherDate());

        /* 2. 设置相关字段的默认值 */
        // isValid是否有效  （0=无效，1=有效） 设置为有效 1= 有效
        voucher.setIsValid(1);
        // createDate创建时间 默认是系统当前时间
        voucher.setCreateDate(new Date());
        // updateDate 默认是系统当前时间
        voucher.setUpdateDate(new Date());

        // 3. 执行添加操作，判断受影响的行数
        AssertUtil.isTrue(voucherMapper.insertSelective(voucher) != 1, "添加凭据信息失败！");

    }

    /**
     * 更新凭据信息
     * 1. 参数校验
     * 2. 设置相关参数的默认值
     * 3. 执行更新操作，判断受影响的行数
     *
     * @param voucher
     */
    @Transactional(propagation = Propagation.REQUIRED)
    public void updateVoucher(Voucher voucher) {
        /* 1. 参数校验  */
        //  凭据信息ID  非空，数据库中对应的记录存在
        AssertUtil.isTrue(null == voucher.getId(), "待更新记录不存在！");
        // 通过主键查询对象
        Voucher temp = voucherMapper.selectByPrimaryKey(voucher.getId());
        // 判断数据库中对应的记录存在
        AssertUtil.isTrue(temp == null, "待更新记录不存在！");
        // 参数校验
        checkVoucherParams(voucher.getVoucherNo(), voucher.getVoucherName(), voucher.getVoucherType(), voucher.getVoucherDate());

        /* 2. 设置相关参数的默认值 */

        /* 3. 执行更新操作，判断受影响的行数 */
        AssertUtil.isTrue(voucherMapper.updateByPrimaryKeySelective(voucher) != 1, "更新凭据信息失败！");

    }

    /**
     * 校验非空和格式
     *
     * @param voucherNo
     * @param voucherName
     * @param voucherType
     * @param voucherDate
     */
    private void checkVoucherParams(Integer voucherNo, String voucherName, Integer voucherType, Date voucherDate) {
        // voucherNo    非空
        AssertUtil.isTrue(voucherNo == null, "凭据编号不能为空！");
        // voucherName           非空
        AssertUtil.isTrue(StringUtils.isBlank(voucherName), "凭据名不能为空！");
        // voucherType       非空
        AssertUtil.isTrue(voucherType == null, "凭据类型不能为空！");
        // voucherDate       非空
        // AssertUtil.isTrue(voucherDate == null,"开票日期不能为空！");


    }

}
